/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Dato.DAO;



import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import transervfx.Dato.Entidad.Usuario;

/**
 *
 * @author oscar
 */
public class UsuarioDAO implements Dao<Usuario,Long> {
 
     private static UsuarioDAO INSTANCE = null;
    
    
     /**
     *  Crea el Gestor Auxiliar
     */
    protected UsuarioDAO() {
    }

    /**
     * creador sincronizado para protegerse de posibles problemas  multi-hilo
     * otra prueba para evitar instanciación múltiple
     */
    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new UsuarioDAO();
        }
    }

    /**
     * Obtiene la instancia.
     * @return devuelve la instancia del "GestorAuxiliar".
     */
    public static UsuarioDAO getInstance() {
        if (INSTANCE == null) {
            createInstance();
        }
        return INSTANCE;
    }
    

    @Override
    public void persist(Usuario entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            EntityTransaction t = em.getTransaction();
            try {
                t.begin();
                System.out.println(entity.getNombreUsuario()+" - "+entity.getClave());
                em.persist(entity);
               
                t.commit();
            } finally {
                if (t.isActive()) {
                    t.rollback();
                }
            }
        } finally {
            em.close();
        }
    }

    @Override
     //Sin transaccion
    public void remove(Usuario entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            em.remove(entity);

        } finally {
            em.close();
        }
    }
   

    @Override
    public Usuario findById(Long id) {
       EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.getReference(Usuario.class, id);

        } finally {
            em.close();
        }
    }
    
    
    public Usuario findByNombreUsuario(String nombreUsuario) {
       EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
       EntityManager em = emf.createEntityManager();
        try {
            Query query = em.createNamedQuery("Usuario.findByNombreUsuario");
            query.setParameter("nombreUsuario", nombreUsuario);
            List<Usuario> lu =  query.getResultList();
            if(lu.size()>0){
                return lu.get(0);
            }else{
                return null;
            }

        } finally {
            em.close();
        }
    }
    

   
    @Override
    public List<Usuario> findAll() {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.createNamedQuery("Usuario.findAll").getResultList();

        } finally {
            em.close();
        }
    }
    
  
    public List<Usuario> findAll(int ini,int fin) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
        Query q=em.createNamedQuery("Usuario.findAll");
       
        q.setFirstResult(ini);
        q.setMaxResults(fin);
            return q.getResultList(); 

        } finally {
            em.close();
        }
    }
    
    public List<Usuario> buscarPorFiltro(String nombreUsuario,String apellido, String nombre, String tipoDocumento, Integer numeroDocumento) {
        String consulta = "SELECT p FROM Usuario p";
        boolean hayotroParametro = false;

        if (!nombreUsuario.equals("") || !apellido.equals("") || !nombre.equals("") || !tipoDocumento.equals("") || numeroDocumento != null) {
            consulta = "SELECT p FROM Usuario p WHERE";
            if (!nombreUsuario.equals("")) {
                consulta = consulta + " p.nombreUsuario LIKE " + "'" + nombreUsuario + "%'";
                hayotroParametro = true;
            }
            if (!apellido.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                
                consulta = consulta + " p.apellido LIKE " + "'" + apellido + "%'";
                hayotroParametro = true;
            }
            if (!nombre.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.nombre LIKE " + "'" + nombre + "%'";


            }
            if (!tipoDocumento.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.tipoDoc LIKE " + "'" + tipoDocumento + "'";

            }
            if (numeroDocumento != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                consulta = consulta + " p.nroDoc =" + "'" + numeroDocumento + "'";

            }

        }
        System.out.println(consulta);
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
        Query query = em.createQuery(consulta);

        return (List<Usuario>) query.getResultList();
        
        } finally {
            em.close();
        }
    }
    
    
    public List<Usuario> buscarPorFiltroRango(String nombreUsuario,String apellido, String nombre, String tipoDocumento, Integer numeroDocumento,int ini, int fin) {
        String consulta = "SELECT p FROM Usuario p";
        boolean hayotroParametro = false;

        if (!nombreUsuario.equals("") || !apellido.equals("") || !nombre.equals("") || !tipoDocumento.equals("") || numeroDocumento != null) {
            consulta = "SELECT p FROM Usuario p WHERE";
            if (!nombreUsuario.equals("")) {
                consulta = consulta + " p.nombreUsuario LIKE " + "'" + nombreUsuario + "%'";
                hayotroParametro = true;
            }
            if (!apellido.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                
                consulta = consulta + " p.apellido LIKE " + "'" + apellido + "%'";
                hayotroParametro = true;
            }
            if (!nombre.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.nombre LIKE " + "'" + nombre + "%'";


            }
            if (!tipoDocumento.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.tipoDoc LIKE " + "'" + tipoDocumento + "'";

            }
            if (numeroDocumento != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                consulta = consulta + " p.nroDoc =" + "'" + numeroDocumento + "'";

            }

        }
       System.out.println(consulta);
        
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
        Query query = em.createQuery(consulta);
        query.setFirstResult(ini);
        query.setMaxResults(fin);
        
        return (List<Usuario>) query.getResultList();
        
        } finally {
            em.close();
        }
    }
    

    @Override
    public void update(Usuario entity) {
          EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

          em.getTransaction().begin();
          
            em.merge(entity);
          
            em.getTransaction().commit();

        } finally {
            em.close();
        }
    }
 

  
      public Usuario findByNombreAndCave(String nombreUsuario, String clave) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            Query query = em.createNamedQuery("Usuario.findByNombreAndCave");
            query.setParameter("nombreUsuario", nombreUsuario);
            query.setParameter("clave", clave);

            return (Usuario) query.getSingleResult();

        } finally {
            em.close();
        }
    }

    public Long numeroDeUsuarios() {
       EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return (Long) em.createNamedQuery("Usuario.count").getSingleResult();

        } finally {
            em.close();
        }
    }

    public Long numeroDeUsuariosFiltrados(String nombreUsuario, String apellido, String nombre, String tipoDocumento, Integer numeroDocumento) {
         String consulta = "SELECT COUNT(p) FROM Usuario p";
        boolean hayotroParametro = false;

        if (!nombreUsuario.equals("") || !apellido.equals("") || !nombre.equals("") || !tipoDocumento.equals("") || numeroDocumento != null) {
            consulta = "SELECT COUNT(p) FROM Usuario p WHERE";
            if (!nombreUsuario.equals("")) {
                consulta = consulta + " p.nombreUsuario LIKE " + "'" + nombreUsuario + "%'";
                hayotroParametro = true;
            }
            if (!apellido.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                
                consulta = consulta + " p.apellido LIKE " + "'" + apellido + "%'";
                hayotroParametro = true;
            }
            if (!nombre.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.nombre LIKE " + "'" + nombre + "%'";


            }
            if (!tipoDocumento.equals("")) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }

                consulta = consulta + " p.tipoDoc LIKE " + "'" + tipoDocumento + "'";

            }
            if (numeroDocumento != null) {
                if (hayotroParametro) {
                    consulta = consulta + " AND ";
                } else {
                    hayotroParametro = true;
                }
                consulta = consulta + " p.nroDoc =" + numeroDocumento  ;

            }

        }
        System.out.println(consulta);
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
        Query query = em.createQuery(consulta);

        return (Long) query.getSingleResult();
        
        } finally {
            em.close();
        }
    }
    
  
}
